'''
正则表达式是一个特殊的字符序列，它能帮助你方便的检查一个字符串是否与某种模式匹配
Python 自1.5版本起增加了re 模块，它提供 Perl 风格的正则表达式模式

正则表达式(regular expression)描述了一种字符串匹配的模式（pattern），
可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等

正则基本语法:https://www.runoob.com/regexp
正则在线测试:http://tool.oschina.net/regex
'''

'''
由基本字符串和限定符、定位符描述

限定符
*	匹配前面的子表达式零次或多次。例如，zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
+	匹配前面的子表达式一次或多次。例如，'zo+' 能匹配 "zo" 以及 "zoo"，但不能匹配 "z"。+ 等价于 {1,}。
?	匹配前面的子表达式零次或一次。例如，"do(es)?" 可以匹配 "do" 、 "does" 中的 "does" 、 "doxy" 中的 "do" 。? 等价于 {0,1}。
{n}	n 是一个非负整数。匹配确定的 n 次。例如，'o{2}' 不能匹配 "Bob" 中的 'o'，但是能匹配 "food" 中的两个 o。
{n,}	n 是一个非负整数。至少匹配n 次。例如，'o{2,}' 不能匹配 "Bob" 中的 'o'，但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m}	m 和 n 均为非负整数，其中n <= m。最少匹配 n 次且最多匹配 m 次。例如，"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

定位符
^	匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性，^ 还会与 \n 或 \r 之后的位置匹配。
$	匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性，$ 还会与 \n 或 \r 之前的位置匹配。
\b	匹配一个单词边界，即字与空格间的位置。
\B	非单词边界匹配。

'''
import re

'''
re.I	使匹配对大小写不敏感
re.L	做本地化识别（locale-aware）匹配
re.M	多行匹配，影响 ^ 和 $
re.S	使 . 匹配包括换行在内的所有字符
re.U	根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X	该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
'''
c = 'ahjhsjhysywp1234s321s34as'
# p = re.compile('.*(hy).*')
# m = p.match(c)
# m = re.match(r'.*(hY).*', c, re.I)  # r描述是正则表达式
m = re.match(r'.*(hy).*(ywp).*', c)  # 整体
# m = re.match(r'(hy)', c)
if m:
    print('match group()', m.groups())
    print('match group(1)', m.group(0), m.group(1), m.group(2))
else:
    print('not match ')

m = re.search(r'(hy).*(ywp)', c)  # 片段、返回一个
if m:
    print('search group()', m.groups())
    print('search group(1)', m.group(1))
else:
    print('not search')
# re.match只匹配字符串的开始，如果字符串开始不符合正则表达式，则匹配失败，函数返回None；而re.search匹配整个字符串，直到找到一个匹配
m = re.search(r'(\d+)', c)
if m:
    print('***search***', m.groups())
else:
    print('not search')

m = re.match(r'(\d+)', c)
if m:
    print('***match***', m.groups())
else:
    print('not match')

# findall、finditer 找出所有匹配的
l = re.findall(r'\d+', c)
print(l)

it = re.finditer(r'\d+', c)
print(it)
for i in it:
    # print(i.group(0))
    print(i.group())

# 替换
print(re.sub(r'\d+', '*', c))
# 分割
print(re.split(r'\d+', c))
# print(re.split(r'\d+', c, maxsplit=2))

# 匹配邮箱

text = input("请输入邮箱:\n")
if re.match(r'^[0-9a-zA-Z_]{1,19}@[0-9a-zA-Z]{1,13}\.[com,cn,net]{1,3}$', text):
    print('邮箱格式正确!')
else:
    print('邮箱格式错误!')
